/*
 * PlayerView.java
 *
 * @author Michael Hansen
 * @author Lukas Thuernagel
 * @author Soeren Warszus
 */

package risk.game;

import javax.swing.*;
import java.awt.*;
import risk.card.*;
import risk.player.*;
import java.util.*;

public class PlayerCardView extends JPanel{
    
    private Card card = null;
    
    private PlayerCardController controller;
    
    private PlayerCard pcm = null;
    
    private ArrayList<JCheckBox> checkboxList;
    
    private ArrayList<CardView> cardViewList;
    
    private JButton backButton;            
   
    private JButton changeButton;

    private JButton nextButton;
    
    private Map<String, JComponent> componentList;
    
    private PlayerModel pm;
        
    //Liste der Karten des Spielers
    private ArrayList<Card> cardList = new ArrayList<Card>();
        /**
     * Temporaere Liste der eingetauschten Karten, die wieder in den Stapel der Restkarten
     * gebracht werden soll, damit die Karten nicht ausgehen
     */
    private ArrayList<Card> tmpCardList = new ArrayList<Card>();
    

    public PlayerCardView (PlayerCard pcm){
        this.pcm = pcm;
        this.pm = pcm.getPlayerModel();
        pm.registerPlayerCardView(pcm,this);
        this.controller = new PlayerCardController(this.pcm,this);
        initializeView();             
    }
    
    /*private void addComponent(JPanel pane, GridBagLayout gbl, GridBagConstraints gbc, 
            Card card, boolean enabled, int i) 
    {
        gbc.anchor = GridBagConstraints.CENTER;
        gbc.insets = new Insets(5, 5, 5, 5);
        JCheckBox checkbox = new JCheckBox();
        checkbox.setSelected(enabled);  
        //checkbox.setActionCommand(actionCommand);
        checkbox.addActionListener(this.controller);
        this.componentList.put("checkbox"+i, checkbox);
        gbl.setConstraints(checkbox, gbc);
        //pane.add(checkbox);
        this.add(checkbox);

        gbc.gridwidth = 1;
    }*/
    
    public Map<String, JComponent> getCheckBoxList(){
        return this.componentList;
    }
    
    public ArrayList<CardView> getCardViewList(){
        return this.cardViewList;
    }
        
    /**
     * Methode zum disablen der Button
     *
     * @param Boolean bool Wahrheitswert, ob sie nicht angezeigt (true) werden sollen 
     *                     oder nicht (false)
     */
    public void disable(boolean bool){
        if(pcm.getPlayerModel().getCardList().size()==0){
            //this.nextButton.setEnabled(!bool);          
        }else{
            this.changeButton.setEnabled(!bool);
            this.backButton.setEnabled(!bool);
        }
        this.revalidate();
    }
    
    public void initializeView(){
        this.removeAll();
        componentList = new HashMap<String, JComponent>();
        GridBagLayout gbl      = new GridBagLayout();
        GridBagConstraints gbc = new GridBagConstraints();
        
        int columnWidths[] = {20, 20, 20, 20};
        int rowHeights[] = {20, 20};
        gbl.columnWidths = columnWidths;
        gbl.rowHeights = rowHeights;
        this.setLayout(gbl); 
        
        ArrayList<Card> cardList = new ArrayList<Card>(pm.getCardList());
        for (int i=0; i<cardList.size(); i++){
           
           //cardViewList.set(i, cardList.get(i).getCardView());
           CardView cv = cardList.get(i).getCardView();
           // Anzeige der Karten
           gbc.gridx = i;
	   gbc.gridy = 0;
           gbc.insets = new Insets(5, 5, 5, 5);
           gbc.anchor = GridBagConstraints.CENTER;
           gbl.setConstraints(cv, gbc);
           this.add(cv);
           //this.getContentPane().add(cardViewList.get(i));
           
           //Checkboxes unter den Karten
           //checkboxList.set(i, new JCheckBox());
           
           JCheckBox cb = new JCheckBox();
           cb.setSelected(false);
           cb.addActionListener(this.controller);
           cb.setActionCommand("checkbox"+i);
           this.componentList.put("checkbox"+i, cb);
           cb.setVisible(true);
           gbc.gridx = i;
           gbc.gridy = 1;
           gbc.insets = new Insets(5, 5, 5, 5);
           gbc.anchor = GridBagConstraints.CENTER;
           gbl.setConstraints(cb, gbc);
           this.add(cb);
           //this.getContentPane().add(checkboxList.get(i));
           
           // Karte hinzufuegen 
           //addComponent(this, gbl, gbc, pm.getCardList().get(i), false, i);
        
        }
        
        if(cardList.size()==0){
            
            JLabel noCards = new JLabel();
            noCards.setText("Sie haben "+cardList.size()+" Karten. Bitte verteilen Sie ihre Ihnen zugewiesenen Soldaten!");
            gbc.gridx = 0;  
	    gbc.gridy = 0;
            gbc.gridwidth = 2;
            gbc.insets = new Insets(10, 0, 5, 5);
            gbc.anchor = GridBagConstraints.EAST;
            gbl.setConstraints(noCards, gbc);
            this.add(noCards);
/*
            nextButton = new JButton("OK");
            nextButton.setActionCommand("keineKartenVorhanden");
            nextButton.addActionListener(this.controller);
            gbc.gridx = 0;  
	    gbc.gridy = 1;
            gbc.gridwidth = 2;
            gbc.insets = new Insets(10, 0, 5, 5);
            gbc.anchor = GridBagConstraints.EAST;
            gbl.setConstraints(nextButton, gbc);
            this.add(nextButton);
 */
        }else{
         
           // Button zum Karten tauschen
           changeButton = new JButton("Tauschen");
           if(cardList.size()<3){
               changeButton.setEnabled(false);
           }
           changeButton.setActionCommand("change");
           changeButton.addActionListener(this.controller);
           
           gbc.gridx = cardList.size()+1;  
	   gbc.gridy = 0;
           gbc.gridwidth = 1;
           gbc.insets = new Insets(10, 0, 5, 5);
           gbc.anchor = GridBagConstraints.SOUTH;
           gbl.setConstraints(changeButton, gbc);
           this.add(changeButton);


        }
        this.setVisible(true);
        System.out.println("PlayerCardView: initializeView(): ComponentenListenGroesse: "+componentList.size());
    }

    public int getCardBonus(){
        int cardBonus=0;
        this.cardList = this.pm.getCardList();
        //Erstellen einer Liste der angewaehlten Karten
        ArrayList<Card> checkedCardList = new ArrayList<Card>();
        for(int j=0;j<this.cardList.size();j++){
            checkedCardList.add(this.cardList.get(j));
        }
        for (int i=0; i<this.cardList.size(); i++){
            if (!((JCheckBox)this.getCheckBoxList().get("checkbox"+i)).isSelected()){
                System.out.println("PlayerCardView: getCardBonus: nummer "+i);
                checkedCardList.remove(this.cardList.get(i));
            }
        }
        
        //Berechnung des Bonus der angewaehlten Karten
        
            //Wenn nicht 3 Karten ausgewaehlt wurden...
            if (checkedCardList.size() != 3){
                System.out.println("Unzulaessige Kartenanzahl gewaehlt. Anzahl: "+checkedCardList.size());
            }
            //Ansonsten betrachte die folgenden Faelle:
            else{
                //1. Die erste Karte ist ein Joker... 
                if(checkedCardList.get(0).getSymbol() == "Joker"){
                    //...dann gibt es wenn die anderen beiden Karten gleich sind und zwar...
                    if (checkedCardList.get(1).getSymbol() == checkedCardList.get(2).getSymbol()){
                        //...Infanterie, Kartenbonus von 4
                        if (checkedCardList.get(1).getSymbol() == "Infanterie"){
                            cardBonus=4;
                        }
                        //...Kavallerie, Kartenbonus von 6
                        else if (checkedCardList.get(1).getSymbol() == "Kavallerie"){
                            cardBonus=6;
                        }
                        //...oder Artillerie, Kartenbonus von 8
                        else if (checkedCardList.get(1).getSymbol() == "Artillerie"){
                            cardBonus=8;
                        }
                    }
                    //...sind sie jedoch verschieden, gibt es auf jedenfall Truppenbonus von 10,
                    //da dann der Joker die fehlende unterscheidliche Karte ersetzt...
                    else if (checkedCardList.get(1).getSymbol() != checkedCardList.get(2).getSymbol()){
                        cardBonus=10;
                    }
                    //...und die getauschten karten werden aus der Kartenliste entfernt
                    cardList.remove(checkedCardList.get(0));
                    cardList.remove(checkedCardList.get(1));
                    cardList.remove(checkedCardList.get(2));
                    tmpCardList.add(checkedCardList.get(0));
                    tmpCardList.add(checkedCardList.get(1));
                    tmpCardList.add(checkedCardList.get(2));
                }
                //2. Die zweite Karte ist ein Joker... analog zu 1.
                else if (checkedCardList.get(1).getSymbol() == "Joker"){
                    if (checkedCardList.get(0).getSymbol() == checkedCardList.get(2).getSymbol()){
                        if (checkedCardList.get(0).getSymbol() == "Infanterie"){
                            cardBonus=4;
                        }
                        else if (checkedCardList.get(0).getSymbol() == "Kavallerie"){
                            cardBonus=6;
                        }
                        else if (checkedCardList.get(0).getSymbol() == "Artillerie"){
                            cardBonus=8;
                        }
                    }
                    else if (checkedCardList.get(0).getSymbol() != checkedCardList.get(2).getSymbol()){
                        cardBonus=10;
                    }
                    cardList.remove(checkedCardList.get(0));
                    cardList.remove(checkedCardList.get(1));
                    cardList.remove(checkedCardList.get(2));
                    tmpCardList.add(checkedCardList.get(0));
                    tmpCardList.add(checkedCardList.get(1));
                    tmpCardList.add(checkedCardList.get(2));
                }
                //3. Die dritte Karte ist ein Joker... analog zu 1.
                else if (checkedCardList.get(2).getSymbol() == "Joker"){
                    if (checkedCardList.get(0).getSymbol() == checkedCardList.get(1).getSymbol()){
                        if (checkedCardList.get(0).getSymbol() == "Infanterie"){
                            cardBonus=4;
                        }
                        else if (checkedCardList.get(0).getSymbol() == "Kavallerie"){
                            cardBonus=6;
                        }
                        else if (checkedCardList.get(0).getSymbol() == "Artillerie"){
                            cardBonus=8;
                        }
                    }
                    else if (checkedCardList.get(0).getSymbol() != checkedCardList.get(1).getSymbol()){
                        cardBonus=10;
                    }
                    cardList.remove(checkedCardList.get(0));
                    cardList.remove(checkedCardList.get(1));
                    cardList.remove(checkedCardList.get(2));
                    tmpCardList.add(checkedCardList.get(0));
                    tmpCardList.add(checkedCardList.get(1));
                    tmpCardList.add(checkedCardList.get(2));
                }
                //4. Alle 3 Karten sind gleich...
                else if (checkedCardList.get(0).getSymbol() == checkedCardList.get(1).getSymbol() &&
                    checkedCardList.get(1).getSymbol() == checkedCardList.get(2).getSymbol()){
                    //...und bei Infanterie is der Kartenbonus 4
                    if (checkedCardList.get(0).getSymbol()=="Infanterie"){
                        cardBonus=4;
                    }
                    //...bei Kavallerie 6
                    else if (checkedCardList.get(0).getSymbol()=="Kavallerie"){
                        cardBonus=6;
                    }
                    //...und bei Artillerie 8
                    else if (checkedCardList.get(0).getSymbol()=="Artillerie"){
                        cardBonus=8;
                    }
                    //Danach werden die eingetauschten Karte aus der Kartenliste des Spielers entfernt
                    cardList.remove(checkedCardList.get(0));
                    cardList.remove(checkedCardList.get(1));
                    cardList.remove(checkedCardList.get(2));
                    tmpCardList.add(checkedCardList.get(0));
                    tmpCardList.add(checkedCardList.get(1));
                    tmpCardList.add(checkedCardList.get(2));
                }
                //5. Alle 3 Karten sind verschieden voneinander, der Bonus ist 10...
                else if (checkedCardList.get(0).getSymbol() != checkedCardList.get(1).getSymbol() &&
                         checkedCardList.get(1).getSymbol() != checkedCardList.get(2).getSymbol()){
                         cardBonus=10;
                }
                //...und die Karten werden wieder entfernt.
                cardList.remove(checkedCardList.get(0));
                cardList.remove(checkedCardList.get(1));
                cardList.remove(checkedCardList.get(2));
                tmpCardList.add(checkedCardList.get(0));
                tmpCardList.add(checkedCardList.get(1));
                tmpCardList.add(checkedCardList.get(2));
                
                //6. Keine der obigen Faelle tritt ein, dann bleibt cardBonus auf 0.
            }
        return cardBonus;
    }
    
}